package com.lujieni.aviator.demos;

import com.googlecode.aviator.runtime.function.AbstractVariadicFunction;
import com.googlecode.aviator.runtime.type.AviatorBoolean;
import com.googlecode.aviator.runtime.type.AviatorObject;

import java.util.Map;

/**
 * 自定义 IN 函数
 * 用法: in(value, item1, item2, item3, ...)
 * 功能: 判断 value 是否在后续的参数列表中
 */
public class InFunc extends AbstractVariadicFunction {

    @Override
    public String getName() {
        return "IN";
    }

    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        if (args.length < 2) {
            throw new IllegalArgumentException("in函数至少需要2个参数: in(value, item1, ...)");
        }

        // 第一个参数是要检查的值
        AviatorObject value = args[0];
        Object valueObj = value.getValue(env);

        // 检查后续参数中是否有匹配的值
        for (int i = 1; i < args.length; i++) {
            Object itemObj = args[i].getValue(env);
            // 比较值是否相等
            if (isEqual(valueObj, itemObj)) {
                return AviatorBoolean.TRUE;
            }
        }

        return AviatorBoolean.FALSE;
    }

    /**
     * 比较两个对象是否相等
     */
    private boolean isEqual(Object obj1, Object obj2) {
        if (obj1 == null && obj2 == null) {
            return true;
        }
        if (obj1 == null || obj2 == null) {
            return false;
        }

        // 如果都是数字，进行数值比较
        if (obj1 instanceof Number && obj2 instanceof Number) {
            return ((Number) obj1).doubleValue() == ((Number) obj2).doubleValue();
        }

        // 其他情况使用 equals 比较
        return obj1.equals(obj2);
    }
}
